﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniCT.LinkShareWpf.Interface;
using System.IO;
using System.Collections.Specialized;
using System.Xml.Serialization;
using System.Collections.ObjectModel;


namespace UniCT.LinkShareWpf.Model
{
   
    public class MyResources
    {

        #region Private
        private ObservableCollection<Resource> resources;
        private NameValueCollection bind;
        #endregion

        #region Static
        private static MyResources _instance = null;

        //Un'unica istanza della classe stessa possa essere creata all'interno del programma. 
        public static MyResources Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new MyResources();
                return _instance;
            }
        }
        #endregion

        public MyResources()
        {
            Read();
        }

        // Applicando l'attributo XmlArray, si può cambiare il nome dell'elemento Xml: Nodes -> MyNodes
        // Recupera o imposta un oggetto che specifica come XmlSerializer serializza un campo pubblico o una proprietà in lettura/scrittura 
        // Invece XmlArrayItem, agisce allo stesso modo ma per i relativi Item
        [XmlArray("Resources")]
        [XmlArrayItem("Resource")]
        public ObservableCollection<Resource> Resources
        {
            get { return resources; }
            set { resources = value; }
        }

        [XmlIgnore]
        public NameValueCollection Bind
        {
            get { return bind; }
        }
        
        public ObservableCollection<String> GetTitleList()
        {
           ObservableCollection<String> obsColl = new ObservableCollection<String>();
           foreach (Resource res in Resources)
               if (!obsColl.Contains(res.CInfo.Title))
                   obsColl.Add(res.CInfo.Title);
           return obsColl;
        }

        private void setBinding()
        {
            try
            {
                NameValueCollection temp = new NameValueCollection();
                foreach (Resource res in this.Resources)
                {
                    if (res.CInfo is ContentInfoTVS)
                    {
                        ContentInfoTVS tvSer = res.CInfo as ContentInfoTVS;
                        string seasonNumber = tvSer.SeasonNumber.ToString();
                        string[] episodeValues = temp.GetValues(seasonNumber);
                        string episodeNumber = tvSer.EpisodNumber.ToString();
                        if (episodeValues == null)
                            temp.Add(seasonNumber, episodeNumber);
                        else
                            if (!episodeValues.Contains(episodeNumber))
                                temp.Add(seasonNumber, episodeNumber);
                    }
                }
                foreach (string sessKey in temp.AllKeys)
                    temp.Add(sessKey, "All");
                temp.Add("All", "All");
                bind = temp;
            }
            catch (Exception e)
            { Console.WriteLine(e.Message); }
        }
        
        public void Read()
        {
            XmlSerializer xs = null;
            try
            {
                
                
                xs = new XmlSerializer(typeof(ObservableCollection<Resource>));
               
               
                
                using (StreamReader sr = new StreamReader(@"..\..\test.xml"))
                    resources = xs.Deserialize(sr) as ObservableCollection<Resource>;
                
                setBinding();
            }
            catch (FileNotFoundException)
            {
                resources = new ObservableCollection<Resource>();
                Console.WriteLine("Il file contenente le risorse non è stato trovato.");
                Save();
            }
            catch (Exception e)
            {
                Console.WriteLine("Lettura File(MyRes): " + e.Message);
            }
        }
       
        public void Save()
        {
            XmlSerializer xs = null;
            try
            {

                // Serializza oggetti in e da documenti XML
                // Inizializza una nuova istanza in grado di serializzare gli oggetti del tipo specificato

                xs = new XmlSerializer(typeof(ObservableCollection<Resource>));
                
                // Inizializza una nuova istanza della classe StreamWriter per il file specificato nel percorso specificato, 
                // utilizzando le dimensioni di buffer e la codifica predefinite. 
                // Se il file esiste, è possibile sovrascriverlo o aggiungervi informazioni ( il booleano permette di fare l'append o sovrascrivere )
                // Se il file non esiste, il costruttore crea un nuovo file.

                using (StreamWriter sw = new StreamWriter(@"..\..\test.xml", false))
                    xs.Serialize(sw, resources);


                setBinding();

            }
            catch
            {
                Console.WriteLine("SAVE 2");
            }
        }

    }

}
